package com.zs.juc;

/**
 * 如何在两个线程之间共享数据
 * Java 里面进行多线程通信的主要方式就是共享内存的方式，共享内存主要的关注点有两个：可见
 * 性和有序性原子性。Java 内存模型（JMM）解决了可见性和有序性的问题，而锁解决了原子性的
 * 问题，理想情况下我们希望做到“同步”和“互斥”。有以下常规实现方法：
 * 将数据抽象成一个类，并将数据的操作作为这个类的方法
 *
 * @author madison
 * @description
 * @date 2021/5/26 16:47
 */
public class MyData {
    private int j = 0;

    public synchronized void add() {
        j++;
        System.out.println("线程" + Thread.currentThread().getName() + "j为: " + j);
    }

    public synchronized void dec() {
        j--;
        System.out.println("线程" + Thread.currentThread().getName() + "j为:" + j);
    }

    public int getData() {
        return j;
    }

    static class AddRunnable implements Runnable {
        MyData myData;

        public AddRunnable(MyData myData) {
            this.myData = myData;
        }

        @Override
        public void run() {
            myData.add();
        }
    }

    static class DecRunnable implements Runnable {
        MyData myData;

        public DecRunnable(MyData myData) {
            this.myData = myData;
        }

        @Override
        public void run() {
            myData.dec();
        }
    }

    public static void main(String[] args) {
        MyData data = new MyData();
        Runnable add = new AddRunnable(data);
        Runnable dec = new DecRunnable(data);
        for (int i = 0; i < 2; i++) {
            new Thread(add).start();
            new Thread(dec).start();
        }
    }
}
